home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / a86v307a.arc / 04ELEM.DOC < prev    next >
Text File  |  1987-04-08  |  11KB  |  250 lines

  1. CHAPTER 4   ELEMENTS OF THE A86 LANGUAGE                  4-1
  2.  
  3. This chapter begins the description of the A86 language.  It's a 
  4. bit more tutorial in nature than the rest of the manual.  I'll 
  5. start by describing the elementary building-blocks of the 
  6. language. 
  7.  
  8.  
  9. The A86 Language and the A86 Program
  10.  
  11. First, let's establish what we mean when we say A86.  On one 
  12. hand, A86 is the name for my assembly language for the Intel 86-
  13. family of (IBM-PC and compatible) computers. Statements written 
  14. in this language are used to specify machine instructions for the 
  15. 86-family and to allocate memory space for program data.  On the 
  16. other hand, A86 is the name for a program called an assembler, 
  17. that translates these human-readable statements into a machine-
  18. readable form. The input to the assembler is a source file (or a 
  19. list of source files) containing assembly language statements.  
  20. The output of the assembler is a file containing binary program 
  21. code that can either be run as a program on the PC, or combined 
  22. with other modules (using a linker) to make a program.  
  23.  
  24.  
  25. General Categories of A86 Elements
  26.  
  27. The statements in an A86 source file can be classified in three 
  28. general categories: instruction statements, data allocation 
  29. statements, and assembler directives.  An instruction statement 
  30. uses an easily-remembered name (a mnemonic) and possibly one or 
  31. more operands to specify a machine instruction to be generated.  
  32. A data allocation statement reserves, and optionally initializes, 
  33. memory space for program data.  An assembler directive is a 
  34. statement that gives special instructions to the assembler.  
  35. Directives are unlike the instruction and data allocation 
  36. statements in that they do not specify the actual contents of 
  37. memory.  Examples of the three types of A86 statements are given 
  38. below.  These are provided to give you a general idea of what the 
  39. different kinds of statements look like.  
  40.  
  41.  
  42. Instruction Statements
  43.  
  44. MOV AX,BX
  45. CALL SORT_PROCEDURE
  46. ADD AL,7
  47.  
  48.  
  49. Data Allocation Statements
  50.  
  51. A_VARIABLE DW 0
  52. DB 'HELLO'
  53.  
  54. Assembler Directives
  55.  
  56. CODE SEGMENT
  57. ITEM_COUNT EQU 5
  58.                                                           4-2
  59. The statements in an A86 source file are made up of keywords, 
  60. identifiers, numbers, strings, special characters, and comments.  
  61. A keyword is a symbol that has special meaning to the assembler, 
  62. such as an instruction mnemonic (MOV, CALL) or some other 
  63. reserved word in the assembly language (DB, SEGMENT, EQU).  
  64. Identifiers are programmer-defined symbols, used to represent 
  65. such things as variables, labels in the code, and numerical 
  66. constants.  Identifiers may contain letters, numbers, and the 
  67. characters _, @, $, and ?, but must begin with a letter, _, or @. 
  68. The identifier name is considered unique up to 127 characters, 
  69. but it can be of any length (up to 255 characters).   Examples of 
  70. identifiers are: COUNT, L1, and A_BYTE.  
  71.  
  72. Numbers in A86 may be expressed as decimal, hexadecimal, octal, 
  73. or binary.  These must begin with a decimal digit and, except in 
  74. the case of a decimal or hexadecimal number, must end with "x" 
  75. followed by a letter identifying the base of the number.  A 
  76. number without an identifying base is hexadecimal if the first 
  77. digit is 0; decimal if the first digit is 1 through 9.  Examples 
  78. of A86 numbers are: 123 (decimal), 0ABC (hexadecimal), 1776xQ 
  79. (octal), and 10100110xB (binary).  
  80.  
  81. Strings are characters enclosed in single-quotes.  Examples of 
  82. strings are: '1st string' and 'SIGN-ON MESSAGE, V1.0'.  The 
  83. single-quote is one of many special characters used in the 
  84. assembly language.  Others, run together in a list, are: 
  85. $?;:=,[].+-()*/>".  The space and tab characters are also special 
  86. characters, used as separators in the assembly language.  
  87.  
  88. For compatibility with other assemblers, I now also accept 
  89. double-quotes for strings. 
  90.  
  91. A comment is a sequence of characters used for program 
  92. documentation only; it is ignored by the assembler.  Comments 
  93. begin with a semicolon (;) and run to the end of the line on 
  94. which they are started.  Examples of lines with comments are 
  95. shown below: 
  96.  
  97. ; This entire line is a comment.
  98. MOV AX,BX  ; This is a comment next to an instruction statement.
  99.  
  100. Alternatively, for compatibility with other assemblers, I provide 
  101. the COMMENT directive.  The next non-blank character after 
  102. COMMENT is a delimiter to a comment that can run across many 
  103. lines; all text is ignored, until a second instance of the 
  104. delimiter is seen.  For example, 
  105.  
  106. COMMENT 'This comment
  107. runs across two lines'
  108.  
  109. I don't like COMMENT, because I think it's very dangerous.  If, 
  110. for example, you have two COMMENTs in your program, and you 
  111. forget to close the first one, the assembler will happily ignore 
  112. all source code between the comments.  If that source code does 
  113. not happen to contain any labels referenced elsewhere, the error 
  114. may not be detected until your program blows up.  For multiline 
  115. comments, I urge you to simply start each line with a semicolon.  
  116.                                                           4-3
  117.  
  118. Statements in the A86 are line-oriented, which means that 
  119. statements may not be broken across line boundaries.  A86 source 
  120. lines may be entered in a free-form fashion; that is, without 
  121. regard to the column-orientation of the symbols and special 
  122. characters.  
  123.  
  124. PLEASE NOTE: Because an A86 line is free-formatted, there is no 
  125. need for you to put the operands to your instructions in a 
  126. separate column!  The only reason that 99% of the assembly-
  127. language programs out there in the world have operands in a 
  128. separate column is that some IBM assembler written back in 1953 
  129. required it.  It makes no sense to have operands in a separate 
  130. column, so STOP DOING IT!  
  131.  
  132.  
  133. Operand Typing and Code Generation
  134.  
  135. A86 is a strongly typed assembly language.   What this means is 
  136. that operands to instructions (registers, variables, labels, 
  137. constants) have a type attribute associated with them which tells 
  138. the assembler something about them.  For example, the operand 4 
  139. has type number, which tells the assembler that it is a numerical 
  140. constant, rather than a register or an address in the code or 
  141. data.  The following discussion explains the types associated 
  142. with instruction operands and how this type information is used 
  143. to generate particular machine opcodes from general purpose 
  144. instruction mnemonics.  
  145.  
  146. Registers
  147.  
  148. The 8086 has 8 general-purpose word registers: 
  149. AX,BX,CX,DX,SI,DI,BP, and SP.  The first four of those registers 
  150. are subdivided into 8 general-purpose byte registers 
  151. AH,AL,BH,BL,CH,CL,DH, and DL.  There are also 4 16-bit segment 
  152. registers CS,DS,ES, and SS, used for addressing memory; and the 
  153. implicit instruction-pointer register.  
  154.  
  155. Variables
  156.  
  157. A variable is a unit of program data with a symbolic name, 
  158. residing at a specific location in 8086 memory.  A variable is 
  159. given a type at the time it is defined, which indicates the 
  160. number of bytes associated with its symbol.  Variables defined 
  161. with a DB statement are given type BYTE (one byte), and those 
  162. defined with the DW statement are given type WORD (two bytes).  
  163. Examples: 
  164.  
  165. BYTE_VAR DB 0   ; A byte variable.
  166. WORD_VAR DW 0   ; A word variable.
  167.                                                           4-4
  168. Labels
  169.  
  170. A label is a symbol referring to a location in the program code.  
  171. It is defined as an identifier, followed by a colon (:), used to 
  172. represent the location of a particular instruction or data 
  173. structure.  Such a label may be on a line by itself or it may 
  174. immediately precede an instruction statement (on the same line).  
  175. In the following example, LABEL_1 and LABEL_2 are both labels for 
  176. the MOV AL,BL instruction.  
  177.  
  178. LABEL_1:
  179. LABEL_2: MOV AL,BL
  180.  
  181. In the A86 assembly language, labels have a type identical to 
  182. that of constants.  Thus, the instruction MOV BX,LABEL_2 is 
  183. accepted, and the code to move the immediate constant address of 
  184. LABEL2 into BX, is generated.  
  185.  
  186. IMPORTANT: you must understand the distinction between a label 
  187. and a variable, because you may generate a different instruction 
  188. than you intended if you confuse them.  For example, if you 
  189. declare  X: DW ?, the colon following the X means that X is a 
  190. label; the instruction MOV SI,X moves the immediate constant 
  191. address of X into the SI register.  On the other hand, if you 
  192. declare X DW ?, with no colon, then X is a word variable; the 
  193. same instruction MOV SI,X now does something different: it loads 
  194. the run-time value of the memory word X into the SI register.  
  195.  
  196.  
  197. Constants
  198.  
  199. A constant is a numerical value computed from an assembly-time 
  200. expression.  For example, 123 and 3 + 2 - 1 both represent 
  201. constants.  A constant differs from an a variable in that it 
  202. specifies a pure number, known by the assembler before the 
  203. program is run, rather than a number fetched from memory when the 
  204. program is running.  
  205.  
  206.  
  207. Generating Opcodes from General Purpose Mnemonics
  208.  
  209. My A86 assembly language is modeled after Intel's ASM86 language, 
  210. which uses general purpose mnemonics to represent classes of 
  211. machine instructions rather than having a different mnemonic for 
  212. each opcode.  For example, the MOV mnemonic is used for all of 
  213. the following: move byte register to byte register, load word 
  214. register from memory, load byte register with constant, move word 
  215. register to memory, move immediate value to word register, move 
  216. immediate value to memory, etc.  This feature saves you from 
  217. having to distinguish "move" from "load," "move constant" from 
  218. "move memory," "move byte" from "move word," etc.  
  219.                                                           4-5
  220. Because the same general purpose mnemonic can apply to several 
  221. different machine opcodes, A86 uses the type information 
  222. associated with an instruction's operands in determining the 
  223. particular opcode to produce.  The type information associated 
  224. with instruction operands is also used to discover programmer 
  225. errors, such as attempting to move a word register to a byte 
  226. register.  
  227.  
  228. The examples that follow illustrate the use of operand types in 
  229. generating machine opcodes and discovering programmer errors.  In 
  230. each of the examples, the MOV instruction produces a different 
  231. 8086 opcode, or an error.  The symbols used in the examples are 
  232. assumed to be defined as follows: BVAR is a byte variable, WVAR 
  233. is a word variable, and LAB is a label.  As you examine these MOV 
  234. instructions, notice that, in each case, the operand on the right 
  235. is considered to be the source and the operand on the left is the 
  236. destination.  This is a general rule that applies to all two-
  237. operand instruction statements.  
  238.  
  239. MOV AX,BX     ; (8B) Move word register to word register.
  240. MOV AX,BL     ; ERROR: Type conflict (word,byte).
  241. MOV CX,5      ; (B9) Move constant to word register.
  242. MOV BVAR,AL   ; (A0) Move AL-register to byte in memory.
  243. MOV AL,WVAR   ; ERROR: Type conflict (byte,word).
  244. MOV LAB,5     ; ERROR: Can't use a label/constant as destination to MOV.
  245. MOV WVAR,SI   ; (89) Move word register to word in memory.
  246. MOV BL,1024   ; ERROR: Constant is too large to fit in a byte.
  247.  
  248.  
  249.  
  250.